package winOrDie.Net.Client;

import java.util.ArrayList;

import winOrDie.Net.Server.WoD_Server_Client;
import winOrDie.Net.Server.WoD_Server_Client_List;

/**
 * This public class provides 
 *
 */
public class WoD_Peers_List {

	/**
	 * The {@link WoD_Peer} {@link ArrayList}
	 */
	private ArrayList<WoD_Peer> woD_Peers = new ArrayList<WoD_Peer>();
	
	
	public void setWoD_Peers(ArrayList<WoD_Peer> woDPeers) {
		woD_Peers = woDPeers;
	}


	public ArrayList<WoD_Peer> getWoD_Peers() {
		return woD_Peers;
	}

	
	public WoD_Peers_List() {
		
		
	}
	
	
	/**
	 * Cronstructor from {@link WoD_Peers_List}
	 * @param clientList
	 */
	public WoD_Peers_List(WoD_Server_Client_List clientList) {
		
		woD_Peers = new ArrayList<WoD_Peer>();
		
		for (WoD_Server_Client woDServerClient : clientList.getClients()) {
			add_WoD_Peer(new WoD_Peer(woDServerClient));
		}
		
	}
	
	
	
	public void add_WoD_Peer(WoD_Peer woD_Peer)
	{
		woD_Peers.add(woD_Peer);
	}
	
	/**
	 * This public method remove {@link WoD_Peer} witch ID matches parameter
	 * @param ID
	 * @throws Exception
	 */
	public void removeWoD_Peer_By_ID(int ID)
	throws Exception
	{
		int position = get_positionOfWoD_Peer_By_ID(ID);
		woD_Peers.remove(position);
	}
	
	/**
	 * This public method removes 
	 * @param P2P_ID
	 */
	public void remove_WoD_Peer_By_P2P_ID(String P2P_ID)
	{
		int position = get_positionOfPeer_By_ScribeNode_ID(P2P_ID);
		if (position != -1)
		{
			woD_Peers.remove(position);			
		}

	}
	
	/**
	 * This public method returns {@link WoD_Peer} defined by parameters
	 * @param scribeNode_ID
	 * @param woD_Peers
	 * @return int
	 * @throws Exception
	 */
	public static int get_positionOfPeer_By_ScribeNode_ID(String scribeNode_ID, ArrayList<WoD_Peer> woD_Peers) 
	{
		for (int position = 0; position < woD_Peers.size(); position++) {
			if (woD_Peers.get(position).getScribeNode_ID().equals(scribeNode_ID))
			{
				return position;
			}
		}
		
		return -1;
	}
	
	
	/**
	 * This public method returns {@link WoD_Peer} defined by parameters
	 * @param clientDirecction
	 * @param udp_port
	 * @return {@link WoD_Peer}
	 * @throws Exception
	 */
	public int get_positionOfPeer_By_ScribeNode_ID(String scribeNode_ID) 
	{
		return get_positionOfPeer_By_ScribeNode_ID(scribeNode_ID, woD_Peers);
	}
	
	
	/**
	 * This public static method returns position of {@link WoD_Peer} if  matches ID passed as parameter
	 * @param ID
	 * @param woD_Peers
	 * @return int
	 * @throws Exception
	 */
	public static int get_positionOfWoD_Peer_By_ID (int ID, ArrayList<WoD_Peer> woD_Peers) 
	throws Exception
	{
		for (int position = 0; position < woD_Peers.size(); position++) {
			if (woD_Peers.get(position).getCliend_Id() ==  ID)
			{
				return position;
			}
			
		}

		Exception exception = new Exception("WoD_Peer with ID: " + ID + " not found");
		throw exception;
	}
	
	
	/**
	 * this public method returns position of {@link WoD_Peer} define by parameters
	 * @param ID
	 * @return int
	 * @throws Exception
	 */
	public int get_positionOfWoD_Peer_By_ID(int ID) 
	throws Exception
	{
		return get_positionOfWoD_Peer_By_ID(ID, woD_Peers);	
	}

	
	/**
	 * This public method returns {@link WoD_Peer} position defined by parameters
	 * @param userName
	 * @return int
	 */
	public static int get_positionOfClient_By_UserName(String userName, ArrayList<WoD_Peer> woD_Peers)
	{
		for (int position = 0; position < woD_Peers.size(); position++) {
			if (woD_Peers.get(position).getUserName().toLowerCase().equals(userName.toLowerCase()))
			{
				return position;
			}
		}
		return -1;
	}
	
	
	public int get_positionOfClient_By_UserName(String userName)
	{
		return get_positionOfClient_By_UserName(userName, woD_Peers);
	}
	
	
}
